import os
import sys
import shutil
import subprocess
import platform

def package_application():
    """
    使用PyInstaller打包项目管理系统 - 精简版，只生成必要文件
    """
    print("="*60)
    print("项目管理系统(PMS)精简打包工具")
    print("="*60)
    
    # 检查PyInstaller是否已安装
    try:
        import PyInstaller
    except ImportError:
        print("PyInstaller未安装，正在尝试安装...")
        try:
            subprocess.check_call([sys.executable, "-m", "pip", "install", "pyinstaller"])
            print("PyInstaller安装成功")
        except subprocess.CalledProcessError:
            print("错误：PyInstaller安装失败")
            return False
    
    # 检查pywebview是否已安装
    try:
        import webview
    except ImportError:
        print("pywebview未安装，正在尝试安装...")
        try:
            subprocess.check_call([sys.executable, "-m", "pip", "install", "pywebview"])
            print("pywebview安装成功")
        except subprocess.CalledProcessError:
            print("错误：pywebview安装失败")
            return False
    
    # 确保依赖项已安装
    print("\n正在确保所有依赖项已安装...")
    try:
        subprocess.check_call([sys.executable, "-m", "pip", "install", "-r", "requirements.txt"])
        print("所有依赖项已安装")
    except subprocess.CalledProcessError:
        print("警告：某些依赖项可能安装失败，但将继续尝试打包")
    
    # 开始打包 - 全部资源打包进单个EXE文件
    print("\n开始打包项目管理系统 - 精简版...")
    pyinstaller_cmd = [
        "pyinstaller",
        "--name=PMS",
        "--add-data=templates;templates",
        "--add-data=static;static",
        "--hidden-import=jinja2",
        "--hidden-import=flask",
        "--hidden-import=werkzeug",
        "--hidden-import=sqlite3",
        "--hidden-import=webview",
        "--hidden-import=webview.platforms.cef",  # CEF支持
        "--hidden-import=webview.platforms.winforms",  # Windows支持
        "--noconsole",  # 不显示控制台窗口
        "--onefile",  # 生成单个可执行文件
        "--clean"  # 清理之前的打包文件
    ]
    
    # 注意：完全移除图标处理代码，避免转换错误
    
    # 使用GUI入口点（src/gui_app.py）
    pyinstaller_cmd.append(os.path.join("src", "gui_app.py"))
    
    # 运行PyInstaller
    try:
        print("正在运行PyInstaller...")
        print(" ".join(pyinstaller_cmd))
        subprocess.check_call(pyinstaller_cmd)
    except subprocess.CalledProcessError:
        print("错误：PyInstaller运行失败")
        return False
    
    print("\n正在生成精简发布包...")
    
    # 创建精简版发布目录
    dist_dir = os.path.join('dist', 'PMS')
    if os.path.exists(dist_dir):
        shutil.rmtree(dist_dir)
    os.makedirs(dist_dir)
    
    # 复制文档文件
    doc_files = [os.path.join('docs', '程序部署文档.md'), os.path.join('docs', '用户手册.md'), os.path.join('docs', '开发文档.md')]
    for doc_file in doc_files:
        if os.path.exists(doc_file):
            shutil.copy(doc_file, os.path.join(dist_dir, os.path.basename(doc_file)))
            print(f"复制 {os.path.basename(doc_file)} 到发布目录")
    
    # 复制可执行文件
    exe_path = os.path.join('dist', 'PMS.exe')
    if os.path.exists(exe_path):
        shutil.copy(exe_path, os.path.join(dist_dir, 'PMS.exe'))
        print(f"复制 PMS.exe 到发布目录")
    else:
        print("错误：未找到生成的 PMS.exe 文件")
        return False
    
    # 创建空的数据库文件（仅创建空文件）
    db_path = os.path.join(dist_dir, 'pms.db')
    open(db_path, 'a').close()
    print("创建空数据库文件 pms.db")
    
    # 创建启动批处理文件 - 确保使用正确的编码
    with open(os.path.join(dist_dir, 'start_pms.bat'), 'w', encoding='utf-8') as f:
        f.write('@echo off\n')
        f.write('chcp 65001 > nul\n')  # 设置UTF-8编码
        f.write('echo 正在启动项目管理系统...\n')
        f.write('start PMS.exe\n')
        f.write('echo 如果窗口没有自动打开，请等待几秒钟...\n')
        f.write('pause\n')
    
    print(f"\n打包完成! 精简版应用程序已生成在 '{dist_dir}' 目录中。")
    print("你可以运行 'start_pms.bat' 来启动应用。")
    print("\n包含的文件:")
    print(" - PMS.exe (所有资源已打包到此可执行文件中)")
    print(" - pms.db (空数据库文件，首次启动时会自动初始化)")
    print(" - start_pms.bat (启动脚本)")
    for doc in doc_files:
        if os.path.exists(os.path.join(dist_dir, os.path.basename(doc))):
            print(f" - {os.path.basename(doc)}")
    
    print("\n注意: 首次启动时，系统会自动初始化数据库。")
    return True

if __name__ == "__main__":
    package_application() 